{
 "metadata": {
  "name": "",
  "signature": "sha256:fffdd74b6827290c551fec8828258892696c75e37bf9de42a2b63c27ba4f2354"
 },
 "nbformat": 3,
 "nbformat_minor": 0,
 "worksheets": [
  {
   "cells": [
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "%load_ext watermark"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 1
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "%watermark -d -a \"Sebastian Raschka\" -v"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Sebastian Raschka 16/09/2014 \n",
        "\n",
        "CPython 3.4.1\n",
        "IPython 2.0.0\n"
       ]
      }
     ],
     "prompt_number": 2
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "<br>\n",
      "<br>"
     ]
    },
    {
     "cell_type": "heading",
     "level": 1,
     "metadata": {},
     "source": [
      "Gaussian Radius Basis Function Kernel PCA with and without Kernel matrix centering"
     ]
    },
    {
     "cell_type": "heading",
     "level": 3,
     "metadata": {},
     "source": [
      "Sections"
     ]
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "- [Example Data](#Example-Data)\n",
      "- [With Kernel Matrix Centering](#With-Kernel-Matrix-Centering)\n",
      "- [Without Kernel Matrix Centering](#Without-Kernel-Matrix-Centering)"
     ]
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "<br>\n",
      "<br>"
     ]
    },
    {
     "cell_type": "heading",
     "level": 1,
     "metadata": {},
     "source": [
      "Example data"
     ]
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "[[back to top](#Sections)]"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "%matplotlib inline"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 3
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "import matplotlib.pyplot as plt\n",
      "\n",
      "from sklearn.datasets import make_moons\n",
      "X, y = make_moons(n_samples=100, random_state=123)\n",
      "\n",
      "plt.figure(figsize=(8,6))\n",
      "\n",
      "plt.scatter(X[y==0, 0], X[y==0, 1], color='red', alpha=0.5)\n",
      "plt.scatter(X[y==1, 0], X[y==1, 1], color='blue', alpha=0.5)\n",
      "\n",
      "plt.title('A nonlinear 2Ddataset')\n",
      "plt.ylabel('y coordinate')\n",
      "plt.xlabel('x coordinate')\n",
      "\n",
      "plt.show()"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stderr",
       "text": [
        "/Users/sebastian/miniconda3/envs/py34/lib/python3.4/site-packages/sklearn/datasets/samples_generator.py:612: DeprecationWarning: using a non-integer number instead of an integer will result in an error in the future\n",
        "  y = np.hstack([np.zeros(n_samples_in, dtype=np.intp),\n"
       ]
      },
      {
       "metadata": {},
       "output_type": "display_data",
       "png": "iVBORw0KGgoAAAANSUhEUgAAAf0AAAGJCAYAAACAf+pfAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xlw1GWex/FPEyIMkBCOJIQEjRBuJBwCgoKJHILLKQMC\nw8jgAR6I7O6sLGoJjsrAOGwBujO61oqiMgLWqCjHKkJ0FDADMjgIyiHBJJCIJoDcEJ79I0MPIUl3\np5M+fv28X1WpSnf/8uvn6ed56pvnbJcxxggAAES8WqFOAAAACA6CPgAAliDoAwBgCYI+AACWIOgD\nAGAJgj4AAJYg6AMOlZWVpRYtWrgfd+rUSZ988kkIUxRYtWrV0rfffhvqZACORtAH/JSRkaHGjRvr\n3LlzoU6KJGnnzp3q169fqJOhPXv2aMSIEUpISFCTJk00ePBg7dmzx/36nDlzFB0drdjYWMXGxqpt\n27Z66KGHVFBQUCPvn5OTo1q1aunixYs1cr9Qvw9Qkwj6gB9ycnKUnZ2thIQErVq1KtTJCZkLFy6U\ne+7YsWMaOXKk9uzZo8LCQvXs2VMjRoxwv+5yuTR+/HgdP35cxcXFevvtt1VQUKDu3bvXWOCXpGCd\nO8b5ZnASgj7gh6VLl2rAgAH65S9/qVdffdXjtRkZGXriiSd00003KTY2Vrfeeqt+/PFH9+urVq1S\nx44d1ahRI2VmZurrr792v5aamqoFCxYoPT1dcXFxGjdunM6ePVvh+6SmpmrDhg2SSnvTY8eO1aRJ\nkxQbG6tOnTpp27Zt7msPHTqk0aNHKyEhQS1bttRzzz3nfi07O1u9e/dWo0aN1Lx5cz300EM6f/68\n+/VatWrpD3/4g1q3bq22bduWS0ePHj00efJkxcXFqXbt2poxY4a++eYbFRcXSyoNkpcCZVRUlDp0\n6KDly5crPj5eCxYscN/n2WefVfPmzZWSkqKXX365zHusXr1aXbt2VcOGDXX11VfrySefdL92abQj\nLi5OMTEx+vzzz7V//37dcsstatq0qeLj4zVx4kQdO3bM/Tfz589XSkqKYmNj1a5dO/fnaIzRvHnz\nlJaWpqZNm+qOO+5w56Oi9wHCngFQZa1atTKvv/662bNnj4mOjjaFhYWVXnvzzTebtLQ0s3fvXnP6\n9GmTkZFh/vM//9MYY8w333xj6tevb9avX28uXLhgfve735m0tDRz/vx5Y4wxqampplevXubw4cOm\nqKjItG/f3rzwwgvGGGM2btxoUlJS3O+TmppqPvroI2OMMbNnzzZ169Y1a9euNRcvXjSzZs0yN9xw\ngzHGmJKSEtOtWzfz1FNPmfPnz5tvv/3WtGzZ0vzf//2fMcaYbdu2mc8//9yUlJSYnJwc0759e7Nw\n4UL3+7hcLjNo0CBTXFxszpw54/Wzevvtt03z5s3dj2fPnm0mTpxY7ronnnjC9OrVyxhjzNq1a01i\nYqL56quvzMmTJ8348eONy+Uy+/fvN8YYk5WVZXbu3GmMMebLL780iYmJ5p133jHGGJOTk2NcLpcp\nKSlx33vfvn1m/fr15ty5c+bIkSOmX79+ZsaMGcYYY77++mvTokULc/jwYWOMMQcPHnS/z8KFC03v\n3r1Nfn6+OXfunJk6daoZP358pe8DhDt6+kAVffrpp8rPz9fw4cPVunVrdejQQcuWLav0epfLpcmT\nJystLU1169bV2LFj9be//U2StHz5cg0dOlT9+/dXVFSUfv3rX+v06dPatGmT+++nT5+uZs2aqVGj\nRho2bJj7b73p27evBg8eLJfLpYkTJ2rHjh2SpL/+9a/64Ycf9Pjjj6t27dq69tprdc899+jNN9+U\nJHXr1k09e/ZUrVq1dM0112jKlCn6+OOPy9x71qxZiouLU506dTymIS8vT9OmTdN//dd/eU1vUlKS\nioqKJEkrVqzQXXfdpQ4dOqhevXplevKSdPPNN6tjx46SpOuuu07jxo1zp9FUMNzeqlUr9e/fX9HR\n0WratKn+9V//1X19VFSUzp49q6+++krnz5/X1VdfrZYtW0qSXnzxRT399NNq3ry5oqOjNXv2bL31\n1lu6ePEiw/pwJII+UEWvvvqqBg0apJiYGEnSmDFjvA7xN2vWzP37z372M504cUJS6TD71Vdf7X7N\n5XKpRYsWys/P9/q33iQmJrp/r1evns6cOaOLFy/q4MGDOnTokBo1auT++e1vf6vvv/9eUulCvKFD\nhyopKUkNGzbUY489VmY6QlKZXQOVOXLkiAYNGqQHH3xQd9xxh9fr8/Pz1aRJE0nS4cOHy7zH5Z+R\nJH3++efKzMxUQkKC4uLi9OKLL5ZL4+UKCws1btw4paSkqGHDhvrlL3/pvj4tLU0LFy7UnDlzlJiY\nqPHjx+vw4cOSStdujBo1yv05dejQQbVr11ZhYaHX/ADhiKAPVMHp06e1YsUKbdiwQUlJSUpKStKC\n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\nTn379q3ppPqluvkL93MJKsvfM888U+axy+WqNC/hXH5X8rU8rvxvPNzL8RJf0tmtWzfl5uaqXr16\nWrt2rUaOHKk9e/YEIXXB4dSy8yZSyu3EiRP6+c9/rkWLFqlBgwblXnd6+XnKX1XLMCyD/ocffljt\neyQlJUmS4uPjNWrUKGVnZ4dN0Khu/pKTk5Wbm+t+nJubq5SUlOomq8Z4yl9iYqIKCgrUrFkzHT58\nWAkJCRVeF87ldyVfyuPKa/Ly8pScnBy0NFaHL/mLiYlx/z5kyBA98MADKioqUuPGjYOWzkBxctl5\nEwnldv78eY0ePVoTJ07UyJEjy73u9PLzlr+qlqGjh/crm8c4deqUfvrpJ0nSyZMn9cEHH3hcmRuu\nKsvf9ddfr7179yonJ0fnzp3T8uXLNXz48CCnzj/Dhw/Xq6++Kkl69dVXK6zETis/X8pj+PDhWrp0\nqSRpy5YtiouLc09zhDtf8ldYWOiur9nZ2TLGOCpweOLksvPG6eVmjNHdd9+tDh06aMaMGRVe4+Ty\n8yV/VS7DaiwsDIk///nPJiUlxdStW9ckJiaawYMHG2OMyc/PN7fddpsxxpj9+/eb9PR0k56ebjp2\n7Gjmzp0byiRXiS/5M8aYNWvWmDZt2phWrVo5Kn8//vij6d+/v2ndurUZOHCgKS4uNsY4v/wqKo8X\nXnjBvPDCC+5rHnzwQdOqVSvTuXNnjztPwpG3/D3//POmY8eOJj093fTu3dts3rw5lMmtknHjxpmk\npCQTHR1tUlJSzP/+7/9GTNl5y5uTy80YY/7yl78Yl8tl0tPTTZcuXUyXLl3MmjVrIqb8fMlfVcsw\nIs7eBwAA3jl6eB8AAPiOoA8AgCUI+gAAWIKgDwCAJQj6AABYgqAPAIAlCPoAasylI0IPHTqkMWPG\n+H2fhQsX6vTp0zWVLAD/wD59AH4pKSlRVFRUmediYmLcpylWx7XXXqutW7eqSZMm1b4XgH+ipw84\n3F//+lelp6fr7NmzOnnypDp16lThN20tXbpU6enp6tKli+68805Jpd/cdcsttyg9PV0DBgxwn1Fe\n2fO/+tWvdN999+mGG27QzJkzdeDAAfXu3VudO3fW448/7n6vnJwc99HJr7zyim6//XYNGTJEbdq0\n0cyZM93XPfDAA+rRo4c6deqkOXPmSJIWL16sQ4cOKTMzU/3795ckffDBB+rTp4+6d++usWPH6uTJ\nkzX/QQI2CPQxggAC7/HHHze//vWvzYMPPmjmzZtX7vWdO3eaNm3amB9//NEYY9zHHw8dOtQsXbrU\nGGPMyy+/bEaOHOnx+UmTJplhw4aZixcvGmOMGTZsmHnttdeMMcb893//t2nQoIExxpgDBw6YTp06\nGWOMWbJkiWnZsqU5fvy4OXPmjLnmmmtMXl6eMcaYoqIiY4wxFy5cMBkZGebvf/+7McaY1NRUd1qP\nHDli+vXrZ06dOmWMMWbevHnmN7/5Tc18cIBl6OkDEeCJJ57QBx98oK1bt+qRRx4p9/qGDRs0duxY\n9xdxxMXFSSr9ApIJEyZIkiZOnKhPP/3U4/Mul0tjxoxxfzXppk2bNH78ePd1lenfv79iYmJUp04d\ndejQQQcPHpQkLV++XN27d1e3bt301VdfVThCsWXLFu3atUt9+vRR165dtXTpUn333XdV/5AAhOdX\n6wKomh9++EEnT55USUmJTp8+rXr16pV53eVyVfqtjVV9/sp7+6JOnTru36OionThwgUdOHBACxYs\n0NatW9WwYUNNnjxZZ86cqfDvBw4cqGXLllX5fQGURU8fiABTp07V008/rQkTJpSZM7/klltu0cqV\nK1VUVCRJKi4uliT16dNHb775piTpjTfeUL9+/Tw+f6Ubb7yxzHW+Msbop59+Uv369RUbG6vCwkKt\nXbvW/XpMTIyOHz8uSerVq5c+++wz7d+/X1Lp1y3v3bvX5/cC8E/09AGHW7p0qerUqaNx48bp4sWL\n6tOnj7KyspSRkeG+pkOHDnrsscd08803KyoqSt26ddPLL7+s5557TpMnT9azzz6rhIQELVmyRJIq\nfV6Se2hfkhYtWqQJEyZo/vz5GjFiRJnXLv3ucrnKPH/puc6dO6tr165q166dWrRooZtuusn9+pQp\nUzR48GAlJyfro48+0iuvvKLx48fr7NmzkqRnnnlGrVu3rrkPEbAEW/YAALAEw/sAAFiCoA8AgCUI\n+gAAWIKgDwCAJQj6AABYgqAPAIAlCPoAAFiCoA8AgCX+H2KAAsdz5+MKAAAAAElFTkSuQmCC\n",
       "text": [
        "<matplotlib.figure.Figure at 0x1064a2898>"
       ]
      }
     ],
     "prompt_number": 4
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "<br>\n",
      "<br>"
     ]
    },
    {
     "cell_type": "heading",
     "level": 1,
     "metadata": {},
     "source": [
      "With Kernel Matrix Centering"
     ]
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "[[back to top](#Sections)]"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "from scipy.spatial.distance import pdist, squareform\n",
      "from scipy import exp\n",
      "from scipy.linalg import eigh\n",
      "import numpy as np\n",
      "\n",
      "def stepwise_kpca(X, gamma, n_components):\n",
      "    \"\"\"\n",
      "    Implementation of a RBF kernel PCA.\n",
      "    \n",
      "    Arguments:\n",
      "        X: A MxN dataset as NumPy array where the samples are stored as rows (M),\n",
      "           and the attributes defined as columns (N).\n",
      "        gamma: A free parameter (coefficient) for the RBF kernel.\n",
      "        n_components: The number of components to be returned.\n",
      "    \n",
      "    \"\"\"\n",
      "    # Calculating the squared Euclidean distances for every pair of points\n",
      "    # in the MxN dimensional dataset.\n",
      "    sq_dists = pdist(X, 'sqeuclidean')\n",
      "\n",
      "    # Converting the pairwise distances into a symmetric MxM matrix.\n",
      "    mat_sq_dists = squareform(sq_dists)\n",
      "\n",
      "    # Computing the MxM kernel matrix.\n",
      "    K = exp(-gamma * mat_sq_dists)\n",
      "\n",
      "    # Centering the symmetric NxN kernel matrix.\n",
      "    N = K.shape[0]\n",
      "    one_n = np.ones((N,N)) / N\n",
      "    K = K - one_n.dot(K) - K.dot(one_n) + one_n.dot(K).dot(one_n)\n",
      "\n",
      "    # Obtaining eigenvalues in descending order with corresponding \n",
      "    # eigenvectors from the symmetric matrix.\n",
      "    eigvals, eigvecs = eigh(K)\n",
      "\n",
      "    # Obtaining the i eigenvectors that corresponds to the i highest eigenvalues.\n",
      "    X_pc = np.column_stack((eigvecs[:,-i] for i in range(1,n_components+1)))\n",
      "    \n",
      "    return X_pc"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 5
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "import numpy as np\n",
      "\n",
      "X_pc = stepwise_kpca(X, gamma=15, n_components=1)\n",
      "\n",
      "plt.figure(figsize=(8,6))\n",
      "plt.scatter(X_pc[y==0, 0], np.zeros((50)), color='red', alpha=0.5)\n",
      "plt.scatter(X_pc[y==1, 0], np.zeros((50)), color='blue', alpha=0.5)\n",
      "\n",
      "plt.title('First principal component after RBF Kernel PCA')\n",
      "plt.text(-0.17, 0.007, 'gamma = 15', fontsize=12)\n",
      "plt.xlabel('PC1')\n",
      "plt.show()"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "display_data",
       "png": "iVBORw0KGgoAAAANSUhEUgAAAf4AAAGJCAYAAABrSFFcAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3X1cVGX+//H3oFjeoIjG7WhIgOCmZJpmt5RhaXfabkZb\nhkluWWasbZr1tbQysV1rt3xU2pbajVS/2tRNZDNXuluJbtgstfUmFQRRV24ENYXx+v0xy8hwM4wM\nBXZez8eDh5xzrs851zVnzrznnDmMNmOMEQAAsAS/1u4AAAD4+RD8AABYCMEPAICFEPwAAFgIwQ8A\ngIUQ/AAAWAjBD48CAgK0c+fO1u6GS0v0Z+7cuZo4cWKL9MfPz08//PBDi6wLJxw5ckTXXnutAgMD\nddNNN7V2d34xsrOz1atXr9buBloZwQ9JUmRkpDp16qSAgAAFBASoa9euKi4uVkVFhSIjI096fT/V\nC0xz+1PbjBkz9NJLL7VMh9CgxMREvfzyy82uf+edd7Rv3z6Vlpbqrbfe0vjx4zVz5swW7KE0fvx4\nnXbaaQoICFBQUJCGDx+ujRs3upYvWbJE7dq1cx0TZ511ll588UXX8p07d8rPz8+1PCAgQAMHDmxw\nW7NmzdK4ceNc04WFhYqLi1NaWlqLjslXfn5+6tKliwICAmS323X//ffr+PHjruXLli3T4MGDFRAQ\noPDwcI0aNUqfffaZ2zqWLFkiPz8/vf322z939+Elgh+SJJvNpvfff18VFRWqqKjQwYMHFRoa6rGm\n9gvCT626uvpn2xZ8Z7PZfKrftWuXYmNjfV5PDYfDUW+ezWbT9OnTVVFRoaKiIvXu3Vu33367W5sL\nL7zQdUy8++67mjZtmv7973+7tSkvL3e1ycvLa3D7tcexa9cuXXLJJRo9erT+/Oc/n9Q4fo7jYMOG\nDaqoqNDatWu1bNky15vkp59+Wr///e/1f//3f9q3b58KCgp0zz33aOXKlW71S5cuVf/+/fXqq6/+\n5H1F8xD88Kj2pezx48dr0qRJGjVqlLp06aLs7GxlZmaqX79+6tq1q+x2u55++mkdPnxYI0eOVFFR\nkdvVg7rGjx+vu+66SyNGjFDXrl2VmJio/Px8t20///zziomJUd++fRvszz333KNrrrlGXbt21fnn\nn+922X3jxo1KSkpSjx49FBoaqrlz50pyP/uqOWt76aWXFBERofDwcM2fP9+1jtzcXA0bNkzdu3dX\neHi47r33XlVVVXn12JWUlOj2229XRESEgoKCNGbMGNeyl156STExMerRo4euv/567dmzx23cL7zw\ngmJiYtS1a1c98sgj2r59u4YNG6bAwEAlJye7+pCdnS273a65c+fqjDPOUJ8+fbRs2TLXusrLy3Xb\nbbcpODhYkZGRmjNnjmq+rHPJkiW66KKL9MADDygoKEhRUVHKyspyq01NTVV4eLjsdrtmzpzperPn\nqfbhhx/WJ598osmTJysgIEBTpkxp8PG58cYbFRYWpsDAQF166aXatGmTJOnRRx/V448/rrfeeksB\nAQFatGiRli1bpqeeekoBAQG6/vrrJUlFRUX69a9/reDgYEVFRem5555zrXvWrFn6zW9+o3Hjxqlb\nt25aunSpx311+umn68Ybb3Q745ek2l9ses455yg+Pl7ff/+9x3U1pGY927dv1yWXXKJx48YpPT3d\ntfyVV15Rv379FBQUpKuuusrjcfDRRx+5jrWQkBCFh4dryZIlrvZHjx7VH/7wB5155pkKDQ3VpEmT\n9OOPP550n/v27auLL75YGzduVHl5uR555BE9//zzGj16tDp27Kh27drp6quv1rx581w1u3bt0mef\nfabFixdrzZo12rt370lvFz8DAxhjIiMjzYcfflhvvs1mM9u3bzfGGJOSkmK6detm/vWvfxljjDly\n5IgJDQ01n376qTHGmLKyMvP1118bY4zJzs42drvd4zZTUlJMQECA+eSTT8zRo0fNfffdZy666CK3\nbY8YMcKUlpaaH3/8scH+9OjRw3zxxRemurra3HLLLSY5OdkYY8zBgwdNaGioefrpp83Ro0dNRUWF\n+fzzz40xxsyaNcvceuutxhhjduzYYWw2m/ntb39rDh8+bL799ltzxhlnuB6Lr776ynz++efG4XCY\nnTt3mvj4ePPnP/+5wcenrlGjRpnk5GRTVlZmqqqqzMcff2yMMWbt2rWmZ8+eJi8vzxw9etTce++9\n5pJLLnFb5+jRo01FRYXZuHGj6dChg7nsssvMjh07THl5uenXr59ZunSpMcaYdevWmfbt25v777/f\nHDt2zHz00Uemc+fO5j//+Y8xxphx48aZ0aNHm8rKSrNz504TGxtrXn75ZWOMMYsXLzb+/v7mr3/9\nqzl+/Lh54YUXTHh4uKsfo0ePNnfddZc5fPiw2bdvnxkyZIhZuHChV7WJiYmu7TRm8eLFprKy0hw7\ndsykpaWZc845x7Vs1qxZZty4ca7p8ePHm5kzZ7qmHQ6HOffcc83jjz9uqqqqzA8//GCioqLMP/7x\nD2OMMY8++qjx9/c3K1asMMY4n6t1jR8/3vzf//2fMcaYyspKc+utt5rLLrvMrX+1n4+ff/65CQwM\nNFu3bjXGnHjuVFdXexxnzXguuOACExERYebOneu2bPny5SY6Otp8//33xuFwmCeeeMJccMEFruV1\nj4Oaff7oo4+a6upqk5mZaTp16mTKysqMMcakpaWZ66+/3pSWlpqKigpz7bXXmhkzZhhjnM8XT8el\nzWYz27ZtM8YYs3HjRhMaGmpeeeUVs3r1atO+fXvjcDg8jvOxxx4zV1xxhTHGmAsuuMDMnz+/yccG\nPz+CH8YYY84880zTpUsXExgYaAIDA82YMWOMMfWDNiUlxa2ud+/eZuHChaa8vNxtflMvMDXru/nm\nm13TlZWVpl27dmb37t2uba9bt86tpnZ/xo8fbyZOnOhalpmZaeLi4owxxixbtsyce+65DW730Ucf\nrRf8NUFpjDHTpk0zqampDdY+88wzrsembn9qKyoqMn5+fq4X49omTJhgpk+f7jZuf39/s2vXLtc6\na95cGWPMoEGDzFNPPeWavv/++01aWpox5kTwHz582LV87Nix5vHHHzfV1dWmQ4cOZvPmza5lCxcu\nNImJicYYZ7BFR0e7lh06dMjYbDazd+9eU1xcbE477TS3wFy2bJkrGD3VGuMM/r/+9a8NPoYNKS0t\nNTabzRw8eNAY476PjHEPaWOMycnJMb1793Zbx5NPPmluv/12V/2ll17qcZspKSnm9NNPN4GBgcbP\nz89ERUWZ/fv3u5YvXrzYtG/f3gQGBpqAgABjs9nMlClTXMtrnjs1x0xgYGCjQffoo4+arl27mu7d\nu9d7vlx11VVub5IcDofp1KmTyc/PN8bUPw7WrVtnOnbs6BbCwcHB5vPPPzfHjx83nTt3dtvGv/71\nL9OnTx9XbVPBX9PPs846y8ycOdMcP37cvP766yY0NNTTw2mMMSY6Otr15vCZZ54xCQkJTdbg58el\nfkhyfga5YsUKlZaWqrS0VH/7298abFP3hr13331XmZmZioyMVGJionJyck5qm3a73TXduXNnBQUF\nqaioyDWvqRsEQ0JCXL937NhRlZWVkqSCggJFRUV53Zfa2+ndu7erD1u2bNE111yjsLAwdevWTQ8/\n/LAOHDjQ5PoKCgoUFBSkbt261Vu2Z88enXnmma7pzp07q0ePHiosLGx0XLWnTz/9dNc4Jal79+7q\n2LGja/rMM8/Unj17dODAAVVVVbltq3fv3m7bqX0fR6dOnSRJlZWV2rVrl6qqqhQWFqbu3bure/fu\nuuuuu7R///4ma2t4+nz++PHjevDBBxUdHa1u3bqpT58+kqT//ve/jdbUtmvXLhUVFbn61r17d82d\nO1f79u1ztan93GqIzWbTAw88oNLSUu3cuVOnnXZavc+lzz//fJWWlurgwYMqLi7Wd999p4ceesit\nzYEDB1zHzdSpUxvd1nXXXafbb79dl19+udul/F27dum+++5zjaNHjx6S5Laf6h4HPXr0kJ/fiZfv\nTp06qbKyUvv379fhw4c1aNAg1/pGjhzp9eMqSXl5eSopKdG2bdv02GOPyWazqUePHvrvf//r8b6e\nzz77TDt37tQNN9wgSfrNb36jb7/9Vt98843X28bPg+CHTwYPHqzly5dr//79Gj16tMaOHSvJu5u7\njDEqKChwTVdWVqqkpETh4eGuec29uat3796N/pldQ+us/UKcn5+viIgISdKkSZPUr18/bdu2TeXl\n5ZozZ45XNzX26tVLJSUlKi8vr7csPDzc7U8SDx06pAMHDri22ZS6/S8tLdXhw4dd07t27VJ4eLh6\n9uwpf39/t23l5+c3GYg1/T/ttNPcQq28vFzffvtts/pY1xtvvKGVK1dq7dq1Ki8v144dOyS5f6bu\naX29e/dWnz59XH2rCef333/f1d7b56DkHO+zzz6rxx9/XBUVFQ22DQ4O1g033KC///3vTa63se3M\nnz9f11xzjS6//HLXm8vevXtr0aJFbmM5dOiQzj///EbH35iePXuqY8eO2rRpk2tdZWVlOnjw4En3\nubZhw4bptNNO03vvvddom6VLl8oYo/79+yssLEznnXeeaz7aFoIfXqv7olxVVaU33nhD5eXlrj97\nateunSTnGeuBAweafMHJzMzUZ599pmPHjmnmzJkaNmyY1wHYWEhI0tVXX609e/boL3/5i44ePaqK\nigrl5uY2WvfEE0/oyJEj2rhxo5YsWeL62/HKykoFBASoU6dO+v777/XCCy941bewsDCNHDlSd999\nt8rKylRVVaWPP/5YknTzzTdr8eLF+uabb3T06FE99NBDOv/889W7d2+vxtpQ/x999FFVVVXpk08+\n0apVq3TjjTfKz89PY8eO1cMPP+w6i3/mmWd06623etX/ESNGaOrUqaqoqNDx48e1fft21xiaEhIS\nou3btze6vLKyUqeddpqCgoJ06NChemfRDa2v9hu5IUOGKCAgQE899ZSOHDkih8Oh7777Tl9++aUk\nz8+NGnXbXHHFFYqOjtbzzz/fYPsDBw7ovffe09lnn93kuj1ZsGCBLrvsMg0fPlz79u3TXXfdpSef\nfNJ1c2N5ebn+3//7f81at5+fnyZOnKi0tDTX1ZnCwkJ98MEHPvW5W7dueuyxx3TPPfdoxYoVOnz4\nsKqqqrR69WpNnz5dP/74o95++2299NJL+uabb1w/zz33nJYtW9bgX1Wg9RD88Kj2mUZDZ1Gvv/66\n+vTpo27dumnRokV64403JElxcXG6+eabFRUVpaCgoAbv6rfZbPrtb3+r2bNnq0ePHsrLy9Prr7/e\n4La97U/NdEBAgNasWaO///3vCgsLU2xsrLKzsxutu/TSSxUdHa0rrrhCDzzwgK644gpJ0p/+9Cct\nW7ZMXbt21e9+9zslJyfX60NjXnvtNfn7+ysuLk4hISF69tlnJUnDhw/X448/rl//+tcKDw/Xjh07\n9OabbzZ73KGhoa6/Ohg3bpwWLlyo2NhYSdJzzz2nzp07KyoqShdffLFuueUW15+seXr8JOnVV1/V\nsWPHXHeb33jjja792FTtfffdp3feeUdBQUEN/q36bbfdpjPPPFMRERE6++yzNWzYMI9jTE1N1aZN\nm9S9e3fdcMMN8vPz0/vvv69///vfioqK0hlnnKHf/e53rjea3pzxN9TmgQce0LPPPqtjx47JZrNp\n/fr1rr/R79evn0JCQtz+esDbM/G621q0aJGGDBmipKQkXXLJJZo+fbqSk5PVrVs39e/fX//4xz88\nbsPTdufNm6fo6Gidf/756tatm5KSkrRlyxavaj0tmzp1qp5++mk98cQTCg4OVu/evfX8889rzJgx\nWr58uTp37uz6C5Kan9tvv13V1dVu40Hrsxlv3hp7kJWVpbS0NDkcDt1xxx2aPn16vTZTpkzR6tWr\n1alTJy1ZssT1JReN1ebm5mry5MmqqqpS+/bt9fzzz7suG+GX4/bbb5fdbtfjjz/ean3YuXOnoqKi\nVF1d7faZ6akiOztb48aNc/vIBAA88emVzuFwaPLkycrKytKmTZuUkZGhzZs3u7XJzMzUtm3btHXr\nVi1atEiTJk1qsnbatGl6/PHHlZeXp8cee0zTpk3zpZtoo3x8zwkAaAafgj83N1fR0dGKjIyUv7+/\nkpOTtWLFCrc2K1euVEpKiiRp6NChKisrU3FxscfasLAw101RZWVlXn/mi1OLtzdg/Rz9OJWd6v0H\n8PNq70txYWGh25+Z2O12ff755022KSwsVFFRUaO16enpuuiii/SHP/xBx48f1/r1633pJtqoxYsX\nt3YXFBkZeUrfeFT32w4BoCk+nfF7e6Zxspd0U1NT9eyzzyo/P1/PPPOMJkyY0JzuAQCAOnw644+I\niHC7qaigoKDe3wjXbbN7927Z7XZVVVU1Wpubm6sPP/xQkvNLIO64444Gt88lTgCA1fh8f5QvX/tX\nVVVloqKizI4dO8zRo0dNQkKC2bRpk1ubVatWmZEjRxpjjFm/fr0ZOnRok7UDBw402dnZxhhjPvzw\nQzN48OAGt+9j99u0Rx99tLW78JNifKc2xnfq+iWPzZhf/vhaIvd8OuNv3769FixYoCuvvFIOh0Op\nqamKj4/XwoULJUl33nmnRo0apczMTEVHR6tz586uz3Ubq5Wcf+N6zz336OjRo+rYsaMWLVrk05sb\nAADg5FPwS9LIkSM1cuRIt3l33nmn2/SCBQu8rpWcXwNb9yZBAADgu1PvG0ssIjExsbW78JNifKc2\nxnfq+iWPTfrlj68l+PzNfa3JZrPxJTAAAMtoidzjjB8AAAsh+AEAsBCCHwAACyH4AQCwEIIfAAAL\nIfgBALAQgh8+mzlzpvr37y9/f3/Nnj3bbVl2drb8/PwUEBDg+nnttddaqacAAJ+/uQ+IiYnRH//4\nR7344osN/sdJdf+jJgBA6+GMvwV8/fXXGjhwoLp27aqxY8fqpptu0syZMyVJpaWluuaaaxQcHKyg\noCBde+21KiwsdNUmJiZq5syZuvDCCxUQEKDrrrtO//3vf3XLLbeoW7duGjJkiHbt2uVq7+fnpxde\neEExMTHq2rWrHnnkEW3fvl3Dhg1TYGCgkpOTVVVVJUkqKyvzuO2Wctttt+mqq65SQEAAX6gEAG0c\nwe+jY8eOacyYMZowYYJKS0t18803a/ny5a4zX2OMUlNTlZ+fr/z8fHXs2FGTJ092W8dbb72l119/\nXYWFha4QT01NVUlJieLj4+tdPv/ggw+Ul5ennJwczZs3TxMnTlRGRoby8/P17bffKiMjQ5J0/Pjx\nJrdd2zXXXKPu3bs3+HPdddc1+zHat2+fQkNDFRUVpalTp+rw4cPNXhcAwDcEv49ycnLkcDh07733\nql27dhozZoyGDBniWh4UFKQxY8bo9NNPV5cuXfTQQw/po48+ci232Wy6/fbb1adPH3Xt2lUjR45U\nbGysLr/8crVr10433nij8vLy3LY5bdo0denSRf369VP//v01cuRIRUZGuupr2je17bref/99lZaW\nNvizcuXKZj0+8fHx+uabb1RcXKx//vOf+uqrrzR16tRmrQsA4DuC30dFRUWKiIhwm9erVy/XJe/D\nhw/rzjvvVGRkpLp166ZLL71U5eXlbpfEQ0JCXL+ffvrpCg4OdpuurKx0W3/t9h07dqw3XdPem23/\n1EJCQhQXFydJioyM1FNPPaV33333Z9s+AMAdwe+jsLCwep+b5+fnuy71z58/X1u2bFFubq7Ky8v1\n0UcfyRjTaPg2dHNcc53stkeOHOl2933tn6uvvtqrbXrT/+PHj5/UOAAALYfg99EFF1ygdu3aacGC\nBaqurtaKFSv0xRdfuJZXVlaqY8eO6tatm0pKSup9Xi/JLYibczbeWL03265t9erVqqioaPBn1apV\njdZVV1frxx9/lMPhUFVVlX788UdXuGdnZ2vXrl0yxqigoEDTp0/X6NGjT3qMAICWQfD7yN/fX3/7\n29/08ssvq3v37nrjjTd0zTXXqEOHDpKktLQ0HTlyRD179tQFF1ygkSNH1jsrrj1ts9maXF5XY/Xe\nbLsl3HHHHerUqZPefPNNzZkzR506ddLrr78uScrLy9OFF16oLl266MILL9Q555yjZ599tsX7AADw\njs2cwn9/1RL/L/FPYejQobr77ruVkpLS2l0BAPyCtETuccbfAj7++GMVFxerurpaS5cu1Xfffaer\nrrqqtbsFAEA9fHNfC/jPf/6jsWPH6tChQzrrrLP0zjvvuN1pDwBAW8GlfgAAThFc6gcAACeF4AcA\nwEIIfgAALITgBwDAQgh+AAAshOAHAMBCCH4AACyE4AcAwEIIfgAALITgBwDAQgh+AAAshOAHAMBC\nfA7+rKwsxcXFKSYmRvPmzWuwzZQpUxQTE6OEhATl5eV5Vfvcc88pPj5eZ599tqZPn+5rNwEAgHz8\nb3kdDocmT56sDz/8UBERETrvvPN03XXXKT4+3tUmMzNT27Zt09atW/X5559r0qRJysnJ8Vi7bt06\n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\nnhc2m/Ol58UXCf/aWiL3fLrUX1hYqF69ermm7Xa7CgsLvWpTVFTUaO3evXsVEhIiSQoJCdHevXt9\n6aY1PP+881+bzX1+TaBXV58If2Ocb60PHXK+ytSE+MGDzqMxONj5b2XliemAAOcRvn278/fgYGfg\nb9/uPKIrK53TAQFSfr7Uvr1zXmXlid9DQ51ta9oHBDhrKitPzA8NbbzmZJd16CAtWeL8tzm169Y5\nfxqrb2r9dZfX3aa36/CmHzVt9u1zPqY1+2zfvhOngjVqr6t2/U/Am03VtKn7lGjOLmjuQ9zS62jp\n5b4eHrUPz9qHW2OHYe35NYdzfn7D82of9kePOl9K6r6EtGt3ItyPHHH+63A429ps9UNfcs6vqjrx\n0oaW096XYlvdkGmEN+9OjDENrs9ms3nczqxZs1y/JyYmKjEx0as+AQDQ1mVnZys7O7tF1+lT8EdE\nRKigoMA1XVBQILvd7rHN7t27ZbfbVVVVVW9+RESEJLku8YeGhmrPnj0KDg5utA+1g9/S7r7beam/\n7pssP78Tl/pr3lLbbFKnTicu9TsczuVduzrfmu/b5/y3S5cT0w6H8/pezaX+w4ed6zvrrBOX+isr\n3S/1d+ni3F51tfP34mLnqYDkbF9R4exDly7O64GSs02XLg3XnOyyY8ek8eOd10+bU1vzgef69c1b\nf93lkvs2Je/W4U0/atr84x/O662HDzv3WWTkiWU1LrvsxLpq+lC3TQvxZlM1bbp0cX9KNGcXSM17\niFt6HS29vLmHQO3DrfbhWXO4NXYY1p5fc1k/Kqr+pf6oKPdL/QcPnrisX/slpOayvuT8GODIEed8\nm83ZX5vN/SVKcq7T39/50mZldU9oZ8+e7fM6ffqMv7q6Wn379tXatWsVHh6uIUOGeLy5LycnR2lp\nacrJyfFYO23aNPXo0UPTp09Xenq6ysrKuLnPG9zcx8193NzHzX3c3PeL1uo390nS6tWrlZaWJofD\nodTUVM2YMUMLFy6UJN15552SpMmTJysrK0udO3fW4sWLde655zZaKzn/nG/s2LHKz89XZGSk3n77\nbQUGBtbvPMEPALCQNhH8rYngBwBYSavf1Q8AAE4tBD8AABZC8AMAYCEEPwAAFkLwAwBgIQQ/AAAW\nQvADAGAhBD8AABZC8AMAYCEEPwAAFkLwAwBgIQQ/AAAWQvADAGAhBD8AABZC8AMAYCEEPwAAFkLw\nAwBgIQQ/AAAWQvADAGAhBD8AABZC8AMAYCEEPwAAFkLwAwBgIQQ/AAAWQvADAGAhBD8AABZC8AMA\nYCEEPwAAFkLwAwBgIQQ/AAAWQvADAGAhBD8AABbiU/CXlJQoKSlJsbGxGjFihMrKyhpsl5WVpbi4\nOMXExGjevHlN1q9Zs0aDBw/WgAEDNHjwYK1bt86XbgIAgP/xKfjT09OVlJSkLVu2aPjw4UpPT6/X\nxuFwaPLkycrKytKmTZuUkZGhzZs3e6w/44wz9P7772vDhg1aunSpxo0b50s3AQDA/9iMMaa5xXFx\ncfroo48UEhKi4uJiJSYm6vvvv3drs379es2ePVtZWVmS5Ar3Bx980Kt6Y4x69uyp4uJi+fv7u3fe\nZpMP3QcA4JTSErnn0xn/3r17FRISIkkKCQnR3r1767UpLCxUr169XNN2u12FhYVe17/77rsaNGhQ\nvdAHAAAnr31TDZKSklRcXFxv/pw5c9ymbTabbDZbvXZ15xljGm1Xd/7GjRv14IMPas2aNU11EwAA\neKHJ4PcUujWX6ENDQ7Vnzx4FBwfXaxMREaGCggLX9O7duxUREdFk/e7du3XDDTfotddeU58+fRrt\nw6xZs1y/JyYmKjExsakhAQBwSsjOzlZ2dnaLrtOnz/inTZumHj16aPr06UpPT1dZWVm9G/yqq6vV\nt29frV27VuHh4RoyZIgyMjIUHx/faH1ZWZkuvfRSzZ49W6NHj26883zGDwCwkJbIPZ+Cv6SkRGPH\njlV+fr4iIyP19ttvKzAwUEVFRZo4caJWrVolSVq9erXS0tLkcDiUmpqqGTNmeKx/4oknlJ6erpiY\nGNe21qxZo549e7p3nuAHAFhIqwd/ayP4AQBW0up39QMAgFMLwQ8AgIUQ/AAAWAjBDwCAhRD8AABY\nCMEPAICFEPwAAFgIwQ8AgIUQ/AAAWAjBDwCAhRD8AABYCMEPAICFEPwAAFgIwQ8AgIUQ/AAAWAjB\nDwCAhRD8AABYCMEPAICFEPwAAFgIwQ8AgIUQ/AAAWAjBDwCAhRD8AABYCMEPAICFEPwAAFgIwQ8A\ngIUQ/AAAWAjBDwCAhRD8AABYCMEPAICFEPwAAFgIwQ8AgIUQ/AAAWEizg7+kpERJSUmKjY3ViBEj\nVFZW1mC7rKwsxcXFKSYmRvPmzfO6Pj8/X126dNH8+fOb20UAAFBHs4M/PT1dSUlJ2rJli4YPH670\n9PR6bRwOhyZPnqysrCxt2rRJGRkZ2rx5s1f1U6dO1dVXX93c7gEAgAY0O/hXrlyplJQUSVJKSoqW\nL19er01ubq6io6MVGRkpf39/JScna8WKFU3WL1++XFFRUerXr19zuwcAABrQ7ODfu3evQkJCJEkh\nISHau3dvvTaFhYXq1auXa9put6uwsNBjfWVlpZ566inNmjWruV0DAACNaO9pYVJSkoqLi+vNnzNn\njtu0zWaTzWar167uPGNMo+1q5s+aNUu///3v1alTJxljmh4BAADwmsfgX7NmTaPLQkJCVFxcrNDQ\nUO3Zs0fBwcH12kRERKigoMA1vXv3bkVERHisz83N1bvvvqtp06aprKxMfn5+6tixo+6+++4G+1H7\nykBiYqISExM9DQkAgFNGdna2srOzW3SdNtPM0+pp06apR48emj59utLT01VWVlbvBr3q6mr17dtX\na9euVXh4uIYMGaKMjAzFx8d7VT979mwFBARo6tSpDXfeZuOqAADAMloi95r9Gf+DDz6oNWvWKDY2\nVv/85z/14IMPSpKKiopcd+O3b99eCxYs0JVXXql+/frppptuUnx8vMd6AADw02n2GX9bwBk/AMBK\nWvWMHwAAnHoIfgAALITgBwDAQgh+AAAshOAHAMBCCH4AACyE4AcAwEIIfgAALITgBwDAQgh+AAAs\nhOAHAMBCCH4AACyE4AcAwEIIfgAALITgBwDAQgh+AAAshOAHAMBCCH4AACyE4AcAwEIIfgAALITg\nBwDAQgh+AAAshOAHAMBCCH4AACyE4AcAwEIIfgAALITgBwDAQgh+AAAshOAHAMBCCH4AACyE4AcA\nwEIIfgAALITgBwDAQpod/CUlJUpKSlJsbKxGjBihsrKyBttlZWUpLi5OMTExmjdvnlf1GzZs0LBh\nw3T22WdrwIABOnr0aHO7CQAAaml28KenpyspKUlbtmzR8OHDlZ6eXq+Nw+HQ5MmTlZWVpU2bNikj\nI0ObN2/2WF9dXa1x48Zp0aJF+u677/TRRx/J39+/ud0EAAC1NDv4V65cqZSUFElSSkqKli9fXq9N\nbm6uoqOjFRkZKX9/fyUnJ2vFihUe6z/44AMNGDBA/fv3lyR1795dfn58IgEAQEtodqLu3btXISEh\nkqSQkBDt3bu3XpvCwkL16tXLNW2321VYWOixfsuWLbLZbLrqqqs0aNAg/fGPf2xuFwEAQB3tPS1M\nSkpScXFxvflz5sxxm7bZbLLZbPXa1Z1njGm0Xc386upqffrpp/ryyy/VsWNHDR8+XIMGDdLll1/e\n9GgAAIBHHoN/zZo1jS4LCQlRcXGxQkNDtWfPHgUHB9drExERoYKCAtf07t27FRER4bG+V69euuSS\nSxQUFCRJGjVqlL7++utGg3/WrFmu3xMTE5WYmOhpSAAAnDKys7OVnZ3douu0GWNMcwqnTZumHj16\naPr06UpPT1dZWVm9G/yqq6vVt29frV27VuHh4RoyZIgyMjIUHx/faH1paamuuOIKffrpp/L399fI\nkSM1depUjRw5sn7nbTY1s/sAAJxyWiL3mh38JSUlGjt2rPLz8xUZGam3335bgYGBKioq0sSJE7Vq\n1SpJ0urVq5WWliaHw6HU1FTNmDHDY70kvfHGG5o7d65sNpuuvvrqBv9iQCL4AQDW0qrB3xYQ/AAA\nK2mJ3OPv5AAAsBCCHwAACyH4AQCwEIIfAAALIfgBALAQgh8AAAsh+AEAsBCCHwAACyH4AQCwEIIf\nAAALIfgBALAQgh8AAAsh+AEAsBCCHwAACyH4AQCwEIIfAAALIfgBALAQgh8AAAsh+AEAsBCCHwAA\nCyH4AQCwEIIfAAALIfgBALAQgh8AAAsh+AEAsBCCHwAACyH4AQCwEIIfAAALIfgBALAQgh8AAAsh\n+AEAsBCCHwAACyH4AQCwkGYHf0lJiZKSkhQbG6sRI0aorKyswXZZWVmKi4tTTEyM5s2b12T9jz/+\nqJtvvlkDBgxQv379lJ6e3twuAgCAOpod/Onp6UpKStKWLVs0fPjwBgPa4XBo8uTJysrK0qZNm5SR\nkaHNmzd7rH/zzTclSRs2bNBXX32lhQsXKj8/v7ndPGVlZ2e3dhd+Uozv1Mb4Tl2/5LFJv/zxtYRm\nB//KlSuVkpIiSUpJSdHy5cvrtcnNzVV0dLQiIyPl7++v5ORkrVixwmN9WFiYDh06JIfDoUOHDqlD\nhw7q2rVrc7t5yvqlP3kZ36mN8Z26fsljk37542sJzQ7+vXv3KiQkRJIUEhKivXv31mtTWFioXr16\nuabtdrsKCws91l955ZXq2rWrwsLCFBkZqQceeECBgYHN7SYAAKilvaeFSUlJKi4urjd/zpw5btM2\nm002m61eu7rzjDGNtquZ//rrr+vIkSPas2ePSkpKdPHFF2v48OHq06dP06MBAACemWbq27ev2bNn\njzHGmKKiItO3b996bdavX2+uvPJK1/STTz5p0tPTPdZPmjTJvPbaa66aCRMmmLfffrvBPkjihx9+\n+OGHH0v9+MrjGb8n1113nZYuXarp06dr6dKlGj16dL02gwcP1tatW7Vz506Fh4frrbfeUkZGhsf6\nuLg4/fOf/9Stt96qQ4cOKScnR7///e8b7IMz+wEAgLdsppnpWVJSorFjxyo/P1+RkZF6++23FRgY\nqKKiIk2cOFGrVq2SJK1evVppaWlyOBxKTU3VjBkzPNYfPXpUqamp+uabb3T8+HFNmDBB999/f8uN\nGAAAC2t28AMAgFNPm/7mPm++JKigoECXXXaZfvWrX+nss8/Ws88+e1L1rcnb/k2YMEEhISHq37+/\n2/xZs2bJbrdr4MCBGjhwoLKysn6ObnvN1/H9UvZfY19i1Rb3X2N9rW3KlCmKiYlRQkKC8vLyTqq2\ntfkyvsjISA0YMEADBw7UkCFDfq4un5Smxvf9999r2LBhOv300zV//vyTqm0LfBlfW99/TY3tjTfe\nUEJCggYMGKALL7xQGzZs8Lq2Hp/vEvgJPfDAA2bevHnGGGPS09PN9OnT67XZs2ePycvLM8YYU1FR\nYWJjY83mzZu9rm9N3vbv448/Nl9//bU5++yz3ebPmjXLzJ8//yfvZ3P5Or5fwv6rrq42Z511ltmx\nY4c5duyYSUhIMJs2bTLGtL3956mvNVatWmVGjhxpjDEmJyfHDB061Ova1ubL+IwxJjIy0hw4cOBn\n7fPJ8GZ8+/btM1988YV5+OGHzZ/+9KeTqm1tvozPmLa9/7wZ27/+9S9TVlZmjDFm9erVPh17bfqM\n35svCQoNDdU555wjSerSpYvi4+Nd3xXgTX1r8rZ/F198sbp3797gMtOGP6nxdXy/hP3n6UuspLa1\n/5rqq+Q+5qFDh6qsrEzFxcVe1ba25o6v9neUtKX9VZc34zvjjDM0ePBg+fv7n3Rta/NlfDXa6v7z\nZmzDhg1Tt27dJDmfm7t37/a6tq42HfzefElQbTt37lReXp6GDh3arPqfW0v077nnnlNCQoJSU1Pb\n3KVwX8f3S9h/nr7ESmpb+6+pvnpqU1RU1GRta/NlfJLz+0auuOIKDR48WC+99NLP0+mT4M34fora\nn4uvfWzL++9kx/byyy9r1KhRzaqVmvgCn5+Dr18SVKOyslK/+c1v9Je//EVdunSpt7yp+p9KS42v\nIZMmTdIjjzwiSZo5c6buv/9+vfzyy83vbDP8lONryfrmaukvsaqtLey/2rx9fNvqWVNTfB3fp59+\nqvDwcO3fv19JSUmKi4vTxRdf3JJd9Imvx1db52sfP/vsM4WFhbXJ/XcyY1u3bp1eeeUVffbZZydd\nW6PVg3/NmjWNLgsJCVFxcbFCQ0O1Z88eBQcHN9iuqqpKv/71r3Xrrbe6fZ+At/U/pZYYX2Nqt7/j\njjt07bXXNrufzfVTju+XsP8iIiJUUFDgmi4oKJDdbpfUNvZfbZ762lib3bt3y263q6qqqsna1tbc\n8UVEREiSwsPDJTkvJ48ZM0a5ubltJjgk78b3U9T+XHztY1hYmKS2uf+8HduGDRs0ceJEZWVluT4e\nbc7j0qYv9dd8yY+kRr8kyBij1NRU9evXT2lpaSdd35p87d+ePXtcv7/33nv17opvbb6O75ew/2p/\nidWxY8f01ltv6brrrpPU9vafp77WuO666/Tqq69KknJychQYGKiQkBCvalubL+M7fPiwKioqJEmH\nDh3SBx980Or7q66T2Qd1r2r8UvZfjbrja+v7z5ux5efn64YbbtDrr7+u6Ojok6qtp0VvTWxhBw4c\nMMOHDzcxMTEmKSnJlJaWGmOMKSwsNKNGjTLGGPPJJ58Ym81mEhISzDnnnGPOOeccs3r1ao/1bYU3\n4zPGmOTkZBMWFmY6dOhg7Ha7eeWVV4wxxowbN87079/fDBgwwFx//fWmuLi4VcbRGF/H90vZf5mZ\nmSY2NtacddZZ5sknn3TNb4v7r6G+vvjii+bFF190tbnnnnvMWWedZQYMGGC++uorj7VtTXPHt337\ndpOQkGASEhLMr371q1N2fHv27DF2u9107drVBAYGml69epmKiopGa9ua5o7vVNh/TY0tNTXVBAUF\nuXLuvPPO81jrCV/gAwCAhbTpS/0AAKBlEfwAAFgIwQ8AgIUQ/AAAWAjBDwCAhRD8AABYCMEPwE27\ndu00cOBA9e/fX2PHjtWRI0ckScXFxUpOTlZ0dLQGDx6sq6++Wlu3bpUkXXXVVerevXurf/sggKYR\n/ADcdOrUSXl5efr222/VoUMHvfjii5KkMWPG6PLLL9e2bdv05Zdfau7cua7/mGjatGl67bXXWrPb\nALxE8ANo1MUXX6xt27Zp3bp16tChg373u9+5lg0YMEAXXXSRJOnyyy9v8D/HAtD2EPwAGlRdXa3V\nq1drwIAB+u677zRo0KDW7hKAFkDwA3Bz5MgRDRw4UOedd57OPPNMTZgwobW7BKAFtfp/ywugbenY\nsaPy8vLc5v3qV7/SO++847HuVPg/3QFwxg/AC5dffrmOHj2ql156yTVvw4YN+vTTT13T/H9fwKmB\n4AfgprEz9/fee08ffvihoqOjdfbZZ+vhhx9WWFiYJOdNgGPHjtXatWvVq1cvrVmz5ufsMoCTwH/L\nCwCAhXDGDwCAhRD8AABYCMEPAICFEPwAAFgIwQ8AgIUQ/AAAWAjBDwCAhRD8AABYyP8HnynKSwGf\neFAAAAAASUVORK5CYII=\n",
       "text": [
        "<matplotlib.figure.Figure at 0x107978be0>"
       ]
      }
     ],
     "prompt_number": 6
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "<br>\n",
      "<br>"
     ]
    },
    {
     "cell_type": "heading",
     "level": 1,
     "metadata": {},
     "source": [
      "Without Kernel Matrix Centering"
     ]
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "[[back to top](#Sections)]"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "from scipy.spatial.distance import pdist, squareform\n",
      "from scipy import exp\n",
      "from scipy.linalg import eigh\n",
      "\n",
      "def stepwise_kpca_no_center(X, gamma, n_components):\n",
      "    \"\"\"\n",
      "    Implementation of a RBF kernel PCA.\n",
      "    \n",
      "    Arguments:\n",
      "        X: A MxN dataset as NumPy array where the samples are stored as rows (M),\n",
      "           and the attributes defined as columns (N).\n",
      "        gamma: A free parameter (coefficient) for the RBF kernel.\n",
      "        n_components: The number of components to be returned.\n",
      "    \n",
      "    \"\"\"\n",
      "    # Calculating the squared Euclidean distances for every pair of points\n",
      "    # in the MxN dimensional dataset.\n",
      "    sq_dists = pdist(X, 'sqeuclidean')\n",
      "\n",
      "    # Converting the pairwise distances into a symmetric MxM matrix.\n",
      "    mat_sq_dists = squareform(sq_dists)\n",
      "\n",
      "    # Computing the MxM kernel matrix.\n",
      "    K = exp(-gamma * mat_sq_dists)\n",
      "\n",
      "    # Obtaining eigenvalues in descending order with corresponding \n",
      "    # eigenvectors from the symmetric matrix.\n",
      "    eigvals, eigvecs = eigh(K)\n",
      "\n",
      "    # Obtaining the i eigenvectors that corresponds to the i highest eigenvalues.\n",
      "    X_pc = np.column_stack((eigvecs[:,-i] for i in range(1,n_components+1)))\n",
      "    \n",
      "    return X_pc"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 7
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "import numpy as np\n",
      "\n",
      "X_pc = stepwise_kpca_no_center(X, gamma=15, n_components=1)\n",
      "\n",
      "plt.figure(figsize=(8,6))\n",
      "plt.scatter(X_pc[y==0, 0], np.zeros((50)), color='red', alpha=0.5)\n",
      "plt.scatter(X_pc[y==1, 0], np.zeros((50)), color='blue', alpha=0.5)\n",
      "\n",
      "plt.title('First principal component after RBF Kernel PCA')\n",
      "plt.text(0.02, 0.007, 'gamma = 15', fontsize=12)\n",
      "plt.xlabel('PC1')\n",
      "plt.show()"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "display_data",
       "png": "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\nkswVV1zhXDd//nwzYcIE5/KkSZPM3LlzncsOh8NceeWVZuHChaasrMz897//NREREeaf//ynMcaY\nefPmGR8fH7N+/XpjzI9/q+ebNGmS+c1vfmOMMaakpMTcc8895qabbqrU37l/j9u3bzcBAQFm7969\nxpj/+9spLy93Oc+z87nmmmtMWFiYWbx4caV169atM5GRkebbb781DofDPPXUU+aaa65xrj//fnD2\ndz5v3jxTXl5uUlNTTevWrU1hYaExxpikpCTzs5/9zBQUFJji4mJz6623mscff9wY8+Pfi6v7pc1m\nM/v27TPGGLNz507TsWNH8+c//9ls2rTJeHt7G4fD4XKeTz75pBk6dKgxxphrrrnGLF26tNafDS4+\ngh/GGGO6du1q2rZtawICAkxAQIAZM2aMMaZq0CYkJFSq69Kli1m+fLkpKiqqdHttB5iz27vrrruc\nyyUlJaZZs2bm8OHDzn2///77lWrO7WfSpElm6tSpznWpqakmJibGGGPMmjVrzJVXXlntfufNm1cl\n+M8GpTHGzJ492yQmJlZb+9xzzzl/Nuf3c67c3Fzj5eXlPBifa8qUKWbOnDmV5u3j42MOHTrk3ObZ\nB1fGGNOvXz/zzDPPOJcfeeQRk5SUZIz5v+A/efKkc/24cePMwoULTXl5uWnevLnZvXu3c93y5ctN\nXFycMebHYIuMjHSuO3HihLHZbObo0aMmLy/PtGjRolJgrlmzxhmMrmqN+TH4//SnP1X7M6xOQUGB\nsdls5ocffjDGVP4dGVM5pI0xJiMjw3Tp0qXSNp5++mkzefJkZ/2NN97ocp8JCQmmZcuWJiAgwHh5\neZmIiAjz3XffOdevXLnSeHt7m4CAAOPr62tsNpuZOXOmc/3Zv52z95mAgIAag27evHnGz8/PtGvX\nrsrfy80331zpQZLD4TCtW7c2WVlZxpiq94P333/ftGrVqlIIBwcHm+3bt5uKigrTpk2bSvv45JNP\nTLdu3Zy1tQX/2T4vu+wyM3fuXFNRUWFef/1107FjR1c/TmOMMZGRkc4Hh88995zp06dPrTW4+Hiq\nH5J+fA1y/fr1KigoUEFBgf72t79VO+b8C/befvttpaamKjw8XHFxccrIyLigfdrtdudymzZtFBgY\nqNzcXOdttV0gGBIS4vy+VatWKikpkSRlZ2crIiLC7V7O3U+XLl2cPezZs0ejRo1Sp06d5O/vryee\neELHjx+vdXvZ2dkKDAyUv79/lXVHjhxR165dnctt2rRRUFCQcnJyapzXucstW7Z0zlOS2rVrp1at\nWjmXu3btqiNHjuj48eMqKyurtK8uXbpU2s+513G0bt1aklRSUqJDhw6prKxMnTp1Urt27dSuXTvd\nd999+u6772qtPcvV6/MVFRV67LHHFBkZKX9/f3Xr1k2S9P3339dYc65Dhw4pNzfX2Vu7du20ePFi\nHTt2zDnm3L+t6thsNj366KMqKCjQwYMH1aJFiyqvS1999dUqKCjQDz/8oLy8PH3zzTf69a9/XWnM\n8ePHnfebWbNm1biv2267TZMnT9bgwYMrPZV/6NAhPfTQQ855BAUFSVKl39P594OgoCB5ef3f4bt1\n69YqKSnRd999p5MnT6pfv37O7Y0YMcLtn6skZWZmKj8/X/v27dOTTz4pm82moKAgff/99y6v6/n4\n44918OBBjR07VpJ0++236+uvv9aXX37p9r5xcRD88Ej//v21bt06fffddxo9erTGjRsnyb2Lu4wx\nys7Odi6XlJQoPz9foaGhztvqenFXly5danybXXXbPPdAnJWVpbCwMEnS9OnT1aNHD+3bt09FRUVa\ntGiRWxc1du7cWfn5+SoqKqqyLjQ0tNJbEk+cOKHjx48791mb8/svKCjQyZMnncuHDh1SaGio2rdv\nLx8fn0r7ysrKqjUQz/bfokWLSqFWVFSkr7/+uk49nu+NN97Qhg0btGXLFhUVFenAgQOSKr+m7mp7\nXbp0Ubdu3Zy9nQ3nd955xzne3b9B6cf5Pv/881q4cKGKi4urHRscHKyxY8fqH//4R63brWk/S5cu\n1ahRozR48GDng8suXbpoxYoVleZy4sQJXX311TXOvybt27dXq1attGvXLue2CgsL9cMPP1xwz+ca\nNGiQWrRoob///e81jlm9erWMMerVq5c6deqkq666ynk7GheCH247/6BcVlamN954Q0VFRc63PTVr\n1kzSj2esx48fr/WAk5qaqo8//lhnzpzR3LlzNWjQILcDsKaQkKRbbrlFR44c0R//+EeVlpaquLhY\nO3bsqLHuqaee0qlTp7Rz506tWrXK+d7xkpIS+fr6qnXr1vr222/10ksvudVbp06dNGLECN1///0q\nLCxUWVmZPvjgA0nSXXfdpZUrV+rLL79UaWmpfv3rX+vqq69Wly5d3Jprdf3PmzdPZWVl+vDDD7Vx\n40bdcccd8vLy0rhx4/TEE084z+Kfe+453XPPPW71P2zYMM2aNUvFxcWqqKjQ/v37nXOoTUhIiPbv\n31/j+pKSErVo0UKBgYE6ceJElbPo6rZ37gO5AQMGyNfXV88884xOnTolh8Ohb775Rp999pkk138b\nZ50/ZujQoYqMjNSLL75Y7fjjx4/r73//u3r27Fnrtl1ZtmyZbrrpJg0ZMkTHjh3Tfffdp6efftp5\ncWNRUZH+3//7f3XatpeXl6ZOnaqkpCTnszM5OTn617/+5VHP/v7+evLJJ/XAAw9o/fr1OnnypMrK\nyrRp0ybNmTNHp0+f1tq1a/XKK6/oyy+/dH698MILWrNmTbXvqkDDIfjh0rlnGtWdRb3++uvq1q2b\n/P39tWLFCr3xxhuSpJiYGN11112KiIhQYGBgtVf122w23X333VqwYIGCgoKUmZmp119/vdp9u9vP\n2WVfX19t3rxZ//jHP9SpUydFR0crPT29xrobb7xRkZGRGjp0qB599FENHTpUkvT73/9ea9askZ+f\nn375y19q/PjxVXqoyWuvvSYfHx/FxMQoJCREzz//vCRpyJAhWrhwoX7+858rNDRUBw4c0F//+tc6\nz7tjx47Odx1MmDBBy5cvV3R0tCTphRdeUJs2bRQREaHrr79ev/jFL5xvWXP185Okv/zlLzpz5ozz\navM77rjD+Xusrfahhx7SW2+9pcDAwGrfqz5x4kR17dpVYWFh6tmzpwYNGuRyjomJidq1a5fatWun\nsWPHysvLS++8847+/e9/KyIiQh06dNAvf/lL5wNNd874qxvz6KOP6vnnn9eZM2dks9m0bds253v0\ne/TooZCQkErvHnD3TPz8fa1YsUIDBgxQfHy8brjhBs2ZM0fjx4+Xv7+/evXqpX/+858u9+Fqv0uW\nLFFkZKSuvvpq+fv7Kz4+Xnv27HGr1tW6WbNm6dlnn9VTTz2l4OBgdenSRS+++KLGjBmjdevWqU2b\nNs53kJz9mjx5ssrLyyvNBw3PZtx5aOxCWlqakpKS5HA4dO+992rOnDlVxsycOVObNm1S69attWrV\nKueHXNRUu2PHDs2YMUNlZWXy9vbWiy++6HzaCJeOyZMny263a+HChQ3Ww8GDBxUREaHy8vJKr5k2\nFenp6ZowYUKll0wAwBWPjnQOh0MzZsxQWlqadu3apZSUFO3evbvSmNTUVO3bt0979+7VihUrNH36\n9FprZ8+erYULFyozM1NPPvmkZs+e7UmbaKQ8fMwJAKgDj4J/x44dioyMVHh4uHx8fDR+/HitX7++\n0pgNGzYoISFBkjRw4EAVFhYqLy/PZW2nTp2cF0UVFha6/ZovmhZ3L8C6GH00ZU29fwAXl7cnxTk5\nOZXeZmK327V9+/Zax+Tk5Cg3N7fG2uTkZF133XX61a9+pYqKCm3bts2TNtFIrVy5sqFbUHh4eJO+\n8Oj8TzsEgNp4dMbv7pnGhT6lm5iYqOeff15ZWVl67rnnNGXKlLq0BwAAzuPRGX9YWFili4qys7Or\nvEf4/DGHDx+W3W5XWVlZjbU7duzQu+++K+nHD4G49957q90/T3ECAKzG4+ujPPnYv7KyMhMREWEO\nHDhgSktLTZ8+fcyuXbsqjdm4caMZMWKEMcaYbdu2mYEDB9Za27dvX5Oenm6MMebdd981/fv3r3b/\nHrbfqM2bN6+hW/hJMb+mjfk1XZfy3Iy59OdXH7nn0Rm/t7e3li1bpuHDh8vhcCgxMVGxsbFavny5\nJGnatGkaOXKkUlNTFRkZqTZt2jhf162pVvrxPa4PPPCASktL1apVK61YscKjBzcAAOBHHgW/JI0Y\nMUIjRoyodNu0adMqLS9btsztWunHj4E9/yJBAADguab3iSUWERcX19At/KSYX9PG/JquS3lu0qU/\nv/rg8Sf3NSSbzcaHwAAALKM+co8zfgAALITgBwDAQgh+AAAshOAHAMBCCH4AACyE4AcAwEIIfjRa\nc+fOVa9eveTj46MFCxZUWpeeni4vLy/5+vo6v1577bUG6hQAmg6PP7kP+KlERUXpd7/7nV5++eVq\n/yHT+f8ACgBQO874G7EvvvhCffv2lZ+fn8aNG6c777xTc+fOlSQVFBRo1KhRCg4OVmBgoG699Vbl\n5OQ4a+Pi4jR37lxde+218vX11W233abvv/9ev/jFL+Tv768BAwbo0KFDzvFeXl566aWXFBUVJT8/\nP/32t7/V/v37NWjQIAUEBGj8+PEqKyuTJBUWFrrcd32ZOHGibr75Zvn6+vJBTQBQTwj+RurMmTMa\nM2aMpkyZooKCAt11111at26d88zXGKPExERlZWUpKytLrVq10owZMypt480339Trr7+unJwcZ4gn\nJiYqPz9fsbGxVZ4+/9e//qXMzExlZGRoyZIlmjp1qlJSUpSVlaWvv/5aKSkpkqSKiopa932uUaNG\n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\n",
       "text": [
        "<matplotlib.figure.Figure at 0x107de24e0>"
       ]
      }
     ],
     "prompt_number": 8
    }
   ],
   "metadata": {}
  }
 ]
}